package com.mars.admin.modules.post.mapper;

import com.mars.admin.modules.post.entity.Report;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 举报记录Mapper接口
 *
 * @author Mars
 * @version 1.0
 * @date 2025-01-07
 */
@Mapper
public interface ReportMapper extends BaseMapper<Report> {

    /**
     * 查询待处理的举报记录
     *
     * @param page 分页参数
     * @return 待处理举报列表
     */
    Page<Report> selectPendingReports(Page<Report> page);

    /**
     * 根据举报对象查询举报记录
     *
     * @param targetType 举报对象类型
     * @param targetId 举报对象ID
     * @param page 分页参数
     * @return 举报记录列表
     */
    Page<Report> selectByTarget(@Param("targetType") Integer targetType, 
                               @Param("targetId") Long targetId, 
                               Page<Report> page);

    /**
     * 查询用户的举报记录
     *
     * @param reporterId 举报用户ID
     * @param page 分页参数
     * @return 举报记录列表
     */
    Page<Report> selectByReporter(@Param("reporterId") Long reporterId, Page<Report> page);

    /**
     * 查询被举报用户的记录
     *
     * @param reportedUserId 被举报用户ID
     * @param page 分页参数
     * @return 举报记录列表
     */
    Page<Report> selectByReportedUser(@Param("reportedUserId") Long reportedUserId, Page<Report> page);

    /**
     * 统计举报类型分布
     *
     * @return 举报类型统计
     */
    List<Map<String, Object>> countByReportType();

    /**
     * 统计举报状态分布
     *
     * @return 举报状态统计
     */
    List<Map<String, Object>> countByStatus();

    /**
     * 检查用户是否已举报过该对象
     *
     * @param reporterId 举报用户ID
     * @param targetType 举报对象类型
     * @param targetId 举报对象ID
     * @return 是否已举报
     */
    boolean hasReported(@Param("reporterId") Long reporterId, 
                       @Param("targetType") Integer targetType, 
                       @Param("targetId") Long targetId);

    /**
     * 统计对象被举报次数
     *
     * @param targetType 举报对象类型
     * @param targetId 举报对象ID
     * @return 被举报次数
     */
    Long countReports(@Param("targetType") Integer targetType, @Param("targetId") Long targetId);
} 